﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace System.Extensions
{
    /// <summary>
    /// Json扩展实体
    /// </summary>
    public static class JsonExtensions
    {  
        public static object ToJson(this string Json)
        {
            //return Json == null ? null : Newtonsoft.Json.JsonConvert.DeserializeObject(Json); 
            return Json == null ? null : JsonSerializer.Deserialize<object>(Json);
        }
        public static string ToJson(this object obj)
        {
            //var timeConverter = new Newtonsoft.Json.Converters.IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
            //return Newtonsoft.Json.JsonConvert.SerializeObject(obj, timeConverter);
            return JsonSerializer.Serialize(obj,JsonOpt.UnicodeRangesAll);
        }
        public static string ToJson(this object obj, string datetimeformats)
        {
            //var timeConverter = new Newtonsoft.Json.Converters.IsoDateTimeConverter { DateTimeFormat = datetimeformats };
            //return Newtonsoft.Json.JsonConvert.SerializeObject(obj, timeConverter);
            return JsonSerializer.Serialize(obj, JsonOpt.DefaultOptions(datetimeformats));
        }
        public static T ToObject<T>(this string Json)
        {
            //return Json == null ? default : Newtonsoft.Json.JsonConvert.DeserializeObject<T>(Json);
            return Json == null ? default : JsonSerializer.Deserialize<T>(Json,JsonOpt.UnicodeRangesAll);
        }
        public static List<T> ToList<T>(this string Json)
        {
            //return Json == null ? null : Newtonsoft.Json.JsonConvert.DeserializeObject<List<T>>(Json);
            return Json == null ? null : JsonSerializer.Deserialize<List<T>>(Json,JsonOpt.UnicodeRangesAll);
        }
        public static DataTable ToTable(this string Json)
        {
            //return Json == null ? null : Newtonsoft.Json.JsonConvert.DeserializeObject<DataTable>(Json);
            return Json == null ? null : JsonSerializer.Deserialize<DataTable>(Json,JsonOpt.UnicodeRangesAll);
        }
        //public static Newtonsoft.Json.Linq.JObject ToJObject(this string Json)
        //{
        //    return Json == null ? Newtonsoft.Json.Linq.JObject.Parse("{}") : Newtonsoft.Json.Linq.JObject.Parse(Json.Replace("&nbsp;", ""));
        //}
        public static List<T> DataTableToList<T>(DataTable dt) where T : class, new()
        {
            // 定义集合 
            List<T> ts = new List<T>();
            //遍历DataTable中所有的数据行 
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                // 获得此模型的公共属性 
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //遍历该对象的所有属性 
                foreach (PropertyInfo pi in propertys)
                {
                    //定义一个临时变量 
                    string tempName = pi.Name;
                    //检查DataTable是否包含此列（列名==对象的属性名）  
                    if (dt.Columns.Contains(tempName))
                    {
                        //取值 
                        object value = dr[tempName];
                        //如果非空，则赋给对象的属性 
                        if (value != DBNull.Value)
                        {
                            pi.SetValue(t, value, null);
                        }
                    }
                }
                //对象添加到泛型集合中 
                ts.Add(t);
            }
            return ts;
        }
        public static T GetEntity<T>(DataTable table) where T : new()
        {
            T entity = new T();
            foreach (DataRow row in table.Rows)
            {
                foreach (var item in entity.GetType().GetProperties())
                {
                    if (row.Table.Columns.Contains(item.Name))
                    {
                        if (DBNull.Value != row[item.Name] && row[item.Name] != null)
                        {
                            Type type = row[item.Name].GetType();

                            //判断type类型是否为泛型，因为nullable是泛型类,
                            if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类
                            {
                                //如果type为nullable类，声明一个NullableConverter类，该类提供从Nullable类到基础基元类型的转换
                                System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(type);
                                //将type转换为nullable对的基础基元类型
                                type = nullableConverter.UnderlyingType;
                                item.SetValue(entity, Convert.ChangeType(row[item.Name], type), null);
                            }
                            item.SetValue(entity, Convert.ChangeType(row[item.Name], type), null);

                        }

                    }
                }
            }

            return entity;
        }  
    }
}
